#include <iostream>

class Test
{
public:
    Test()
    {
        p = new int;
        std::cout <<"构造函数\n";
    }

    Test(const Test&t)
    {
        std::cout << "拷贝构造" << std::endl;
        p = new int(*t.p);
    }

    ~Test()
    {
        delete p;
        std::cout << "析构函数\n";
    }

private:
    int* p;
};

Test func()
{
    Test t;
    std::cout <<"&t:"<< &t << std::endl;
    return t;
}

int func1()
{
    int a;
    std::cout << "&a = " << &a << std::endl;
    return a;
}

int main()
{
    // Test();//匿名对象，并不是在main函数结束时析构，生命周期只有这一行代码，创建后立马析构。
    // Test t = Test();//将匿名对象的空间赋给名字t的变量，或者给匿名对象一个名字。
    // std::cout << "----------\n";
    /* 这个过程只进行一次构造，通过返回值返回的函数内局部变量通过返回值返回后，这个局部变量的声明周期结束了，
    返回出去的是一个匿名对象，给了匿名对象一个名字 */
    Test T = func();
    std::cout <<"&T:"<< &T << std::endl;
    int A = func1();
    std::cout << "&A = " << &A << std::endl;

    return 0;
}